package IO;/*
 *
 * @author 陈粒
 * @version 创建时间：2021/7/15 16:37
 */
/**
 * FIle类：
 *Java File类的功能非常强大，利用java基本上可以对文件进行所有操作。
 */

import org.junit.Test;

import java.io.*;
import java.util.Date;

public class Files {
    @Test
    public void pathename() {
        //File构造函数一：public File(String pathname)，文件的绝对路径
        String s = "C:\\Users\\tarena\\Desktop\\file1.txt";
        File file = new File(s);//File构造函数，s是文件的绝对路径
        System.out.println(file);//输出绝对路径
    }

    @Test
    public void Createfile1() {//创建文件
        String parentFilePath = "C:\\Users\\tarena\\Desktop\\file";//父文件绝对路径，最后的file是要创建的文件夹
        String childFilePath = "file1.txt";//要创建的子类文件，在父类文件夹里
        File parentFile = new File(parentFilePath);
        parentFile.mkdir();//创建目录
        File file = new File(parentFilePath, childFilePath);
        try {
            file.createNewFile();//用来创建file1.txt文件
        } catch (IOException e) {
            e.printStackTrace();
        }
        /**
         * 1.boolean  file.mkdir()
         * 创建目录
         * 如果创建成功,返回 true , 创建失败，返回false。如果这个文件夹已经存在，则返回false.
         * 只能创建一级目录，如果父目录不存在，返回false.
         * 2.boolean  file.mkdirs()
         * 创建多级目录
         * 创建成功，返回true,创建失败，返回false。如果父目录不存在，就创建，并且返回true.
         * 3.boolean file.createNewFile()
         * 创建一个新的文件
         * 如果文件不存在就创建该文件，创建成功,返回 true ；创建失败，返回false。如果这个文件已经存在，则返回false.
         */
    }

    @Test
    public void Createfile2() {//创建文件
        String parentFilePath = "C:\\Users\\tarena\\Desktop\\newfile1\\newfile2\\newfile_end";
        File parent = new File(parentFilePath);
        parent.mkdirs();//创建多级目录
        File file = new File(parent, "Cat.doc");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void judge() {//判断文件
        String FilePath = "C:\\Users\\tarena\\Desktop\\newfile\\Cat.doc";
        File file = new File(FilePath);
        boolean b = file.canExecute();
        System.out.println(b);
        /**
         * 返回值
         * boolean file.exists() //文件是否存在
         * boolean file.isFile() //是否是文件
         * boolean file.isDirectory() //是否是目录
         * boolean file.isHidden()   //是否隐藏（windows上可以设置某个文件是否隐藏）
         * boolean file.isAbsolute() //是否为绝对路径
         * boolean file.canRead()  //是否可读
         * boolean file.canWrite() //是否可写
         * boolean file.canExecute()  //是否可执行
         */
    }

    @Test
    public void Message() {//文件信息
        String FilePath = "C:\\Users\\tarena\\Desktop\\newfile\\Cat.doc";
        File file1 = new File(FilePath);
        //1.
        System.out.println(file1.getName());
        //2.
        System.out.println(file1.getParent());
        //3.
        File file2 = file1.getParentFile();
        System.out.println(file2.getName());//获取父文件的文件名
        //4.
        long time = file1.lastModified();
        Date dt = new Date(time);
        System.out.println(dt);
        //5.
        File file3 = new File("C:\\Users\\tarena\\Desktop\\newfile\\Cat.doc");//旧文件名
        file1.renameTo(new File("C:\\Users\\tarena\\Desktop\\newfile\\Dog.doc"));//新文件名
        //6.
        long fileLength = file1.length();
        System.out.println(fileLength);
        //7.
        file1.delete();
        /**
         * 1.String file.getName() //获取文件的名字，只是名字，没有路径
         * 2.String file.getParent() //获取父目录的绝对路径，返回值是一个字符串。如果文件有父目录，那么返回父目录的绝对路径，(比如：`E:\cat`) , 如果文件本身就在磁盘的根目录，那么返回磁盘的路径，(比如:`E:\`)。
         * 3.File file.getParentFile() //获取父文件，返回值是一个File对象。
         * 4.long time = file.lastModified() ; //返回文件最后一次修改的时间
         * Date dt = new Date(time);
         *
         * 5.boolean renameTo(File file) //文件命名,新文件命名要用绝对路径
         * 6.long file.length() //返回文件的大小，单位字节
         * 7.boolean file.delete() //删除文件或目录，如果此路径名表示一个目录，则该目录必须为空才能删除。
         *
         *
         * 8.String[] file.list() //获取该目录下的所有的文件的名字。如果`file`为文件，返回值为`null`,在使用时记得判空；但是如果`file`为目录，那么返回这个目录下所有文件的名字，只是名字，不含路径；如果`file`是一个空目录，返回一个长度为0的数组；从上面的结果可以看出，`list()` 方法，只是对`file`为目录时有效，当`file`为一个文件的时候，该方法毫无意义。
         * 9.File[] file.listFiles() //获取该目录下的所有的文件。如果`file`为文件，返回值为`null`,在使用时记得判空；但是如果`file`为目录，那么返回这个目录下所有的文件 ；如果`file`是一个空目录，返回一个长度为0的数组；从上面的结果可以看出，`listFiles()` 方法，只是对`file`为目录时有效，当`file`为一个文件的时候，该方法毫无意义。
         */
    }

    @Test
    public void list_listfiles() {//实战经验1： file.list() ， file.listFiles()
        /**
         * list（）和listFiles（）方法区别：
         * 1.返回值类型不同：前者为String数组，后者为File对象数组
         * 2.数组中元素内容不同：前者为string类型的【文件名】（包含后缀名），后者为File对象类型的【完整路径】
         *
         * 因此，遍历文件夹中所有文件，包括子文件夹中的文件时，必须用listFiles（）方法
         *      list()方法只能遍历当前文件夹下的文件
         */
        String filePath = "C:\\Users\\tarena\\Desktop\\file";
        File file = new File(filePath);
        file.mkdir();

        String[] names = file.list();

        for (int i = 0; i < names.length; i++) {
            System.out.println("names: " + names[i]);
        }

        File[] files = file.listFiles();
        for (int i = 0; i < files.length; i++) {
            System.out.println("files: " + files[i].getAbsolutePath());
        }
    }

    @Test
    public void Scan_files() {//实战经验2：扫描指定文件夹下的所有文件
        String filepath = "C:\\Users\\tarena\\Desktop\\file";
        File file = new File(filepath);
        getfile(file);
    }

    public static void getfile(File file) {
        File[] files1 = file.listFiles();
        for (File f : files1) {
            if (f.isHidden()) continue;
            if (f.isDirectory()) {
                getfile(f);
            } else {
                System.out.println(f.getAbsolutePath());
            }
        }
    }

    @Test
    public void testFileFilter() {//实战：获取指定目录的所有文件夹
        String filepath = "C:\\Users\\tarena\\Desktop\\file";
        File file = new File(filepath);
        getfiles(file);
    }

    public void getfiles(File file) {
        MyFileFilter myFileFilter = new MyFileFilter();
        File[] files2 = file.listFiles(myFileFilter);
        for (File f : files2) {
            if (f.isHidden()) continue;
            else {
                System.out.println(f.getAbsolutePath());
            }
        }
    }

    static class MyFileFilter implements FileFilter {
        public MyFileFilter() {
        }

        @Override
        public boolean accept(File pathname) {
            if (pathname.isDirectory()) {
                return true;
            }
            return false;
        }
    }

    @Test
    public void tesrfilenamefilter() {
        String filepath = "C:\\Users\\tarena\\Desktop\\file";
        File file = new File(filepath);
        getfile3(file);
    }

    public void getfile3(File file) {//实战：扫描出指定路径的所有图片
        myfilenamefilter myfilenamefilters = new myfilenamefilter(".txt");
        File[] filess = file.listFiles(myfilenamefilters);
        for (File f:filess){
            if (f.isHidden())continue;
            if(f.isDirectory()){
                getfile3(f);
            }
            else {
                System.out.println(f.getAbsolutePath());
            }
        }
    }

    static class myfilenamefilter implements FilenameFilter {
        private String type;

        myfilenamefilter(String type) {
            this.type = type;
        }

        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(type);
        }
    }
}
